package br.com.controller.turma;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.model.DualListModel;

import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.excecoes.BDException;
import br.com.arquitetura.servico.ServiceCadastro;
import br.com.controller.acesso.MBAcessoUsuario;
import br.com.data.hibernate.AlunoHibernateDAO;
import br.com.data.hibernate.DiretorHibernateDAO;
import br.com.data.hibernate.TurmaHibernateDAO;
import br.com.model.entidade.Aluno;
import br.com.model.entidade.Diretor;
import br.com.model.entidade.Escola;
import br.com.model.entidade.Turma;
import br.com.model.entidade.Usuario;

@ManagedBean
@ViewScoped
public class MBTurma extends AbstractMBean<Turma>{
	private TurmaHibernateDAO turmaHibernateDAO;
	private AlunoHibernateDAO alunoHibernateDAO;
	private Turma turma;
	private Turma turmaVisualizacao;
	private List<Turma> turmas;
	private boolean vizualizavel;
	private boolean editavel;
	private DualListModel<Aluno> alunos;
	private boolean selecionarAlunos;
	private Escola escola; 
	@ManagedProperty(value="#{serviceCadastro}")
	private ServiceCadastro serviceCadastro;
	
	public void setServiceCadastro(ServiceCadastro serviceCadastro) {
		this.serviceCadastro = serviceCadastro;
	}
	
	public MBTurma(){
		
		
		this.alunoHibernateDAO = (AlunoHibernateDAO) getBean("alunoHibernateDAO");
		this.turmaHibernateDAO = (TurmaHibernateDAO) getBean("turmaHibernateDAO");
		
		MBAcessoUsuario acesso = new MBAcessoUsuario();//Recuperando o usuario e o diretor relacionado a ele
		Usuario user = acesso.getUsuario();
		Diretor d = new Diretor();
		DiretorHibernateDAO diretorHibernateDAO = (DiretorHibernateDAO) getBean("diretorHibernateDAO");
		
		try {
			List<Diretor> lista = diretorHibernateDAO.getByField(Diretor.class,"usuario", user);
			if (!lista.isEmpty()){
				d = lista.get(0);
			}
			
		} catch (BDException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		this.escola = d.getEscola(); 

		limpar();
		
	}
	
	public void setarTurmaDialog(){
		this.turmaVisualizacao = this.turmaHibernateDAO.getById(Turma.class, this.turmaVisualizacao.getId());
	}

	
	public void irEditar(){
		alunos.setTarget(turma.getAlunos());
		try {
			List<Aluno> listaAlunos = alunoHibernateDAO.getByField(Aluno.class,"serie", turma.getSerie());
			listaAlunos.removeAll(turma.getAlunos());
			alunos.setSource(listaAlunos);
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		editavel = true;
		
	}
	
	public void mudarVizualizar(){
		vizualizavel = !vizualizavel;
		
	}
	
	
	
	public Turma getTurmaVisualizacao() {
		return turmaVisualizacao;
	}

	public void setTurmaVisualizacao(Turma turmaVisualizacao) {
		this.turmaVisualizacao = turmaVisualizacao;
	}

	public void excluir(){
		try {
			
			for (Aluno aluno : turma.getAlunos()) {
				aluno.setTurma(null);
				serviceCadastro.atualizar(aluno);
			}
			
			serviceCadastro.excluir(turma);
			
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Turma excluido com sucesso!"));
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao excluir!"));
		}
	}
	
	public void editar(){
		try {
			serviceCadastro.atualizar(turma);
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Turma cadastrado com sucesso!"));
		
			
			
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar!"));
		}
	}
	
	
	public void cadastrar(){
		try {
				if (this.alunos.getTarget().size() > this.turma.getCapacidade()){
					addFacesErrorMessage("Turma não suporta essa quantidade de alunos");
					this.turma.setSerie("");
					this.selecionarAlunos = false;
				}else{
					turma.setEscola(escola);
					
					List<Aluno> alunoTurma = new ArrayList<Aluno>();
					Date data = new Date();
					turma.setAno(data.getYear());
					turma.setAtivo(true);
					turma.setAlunos(alunoTurma);
					serviceCadastro.salvar(turma);
					
					turma = turmaHibernateDAO.getById(Turma.class,turma.getId());
					
					for (Aluno aluno : alunos.getTarget()) {
						
						aluno.setTurma(turma);
						serviceCadastro.atualizar(aluno);
					}
					
					this.limpar();
					FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Turma cadastrado com sucesso!"));
				
				}
			
				
			
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar!"));
		}
	}
	
	
	public void limpar(){
		try {
			this.turmas = turmaHibernateDAO.listAll(Turma.class);
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.turma = new Turma();
		vizualizavel = false;
		editavel = false;
		selecionarAlunos = false;
	}
	
	public void carregarAlunos(){
		if(turma.getSerie().contentEquals("0")){
			selecionarAlunos = false;
		}else{
			selecionarAlunos = true;
			System.out.println(turma.getSerie());
			alunos = new DualListModel<Aluno>(alunoHibernateDAO.buscarSemTurma(turma.getSerie(), this.escola), new ArrayList<Aluno>());
		
		}
	}
	
	public Turma getTurma() {
		return turma;
	}

	public void setTurma(Turma Turma) {
		this.turma = Turma;
	}

	public List<Turma> getTurmas() {
		return this.turmas;
	}

	public void setTurmas(List<Turma> Turmaes) {
		
		
		this.turmas = Turmaes;
	}

	
	public DualListModel<Aluno> getAlunos() {
		return alunos;
	}


	public void setAlunos(DualListModel<Aluno> alunos) {
		this.alunos = alunos;
	}


	public boolean isSelecionarAlunos() {
		return selecionarAlunos;
	}


	public void setSelecionarAlunos(boolean selecionarAlunos) {
		this.selecionarAlunos = selecionarAlunos;
	}


	public boolean isVizualizavel() {
		return vizualizavel;
	}


	public void setVizualizavel(boolean vizualizavel) {
		this.vizualizavel = vizualizavel;
	}


	public boolean isEditavel() {
		return editavel;
	}


	public void setEditavel(boolean editavel) {
		this.editavel = editavel;
	}
	
	
	
}
